#!/bin/bash
"""数据备份脚本

用于备份项目中的重要数据，包括原始数据、清洗后的数据和特征数据等。
支持全量备份和增量备份，可以配置备份目标位置和保留策略。
"""

# 配置参数
BACKUP_DIR="${BACKUP_DIR:-./data/backup}"
SOURCE_DATA_DIR="${SOURCE_DATA_DIR:-./data/raw}"
CLEANED_DATA_DIR="${CLEANED_DATA_DIR:-./data/cleaned}"
FEATURE_DATA_DIR="${FEATURE_DATA_DIR:-./data/features}"
LOGS_DIR="${LOGS_DIR:-./logs}"
BACKUP_PREFIX="fin-senti-data"
RETENTION_DAYS=${RETENTION_DAYS:-30}

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# 确保备份目录存在
ensure_backup_dir() {
    if [ ! -d "$BACKUP_DIR" ]; then
        log "创建备份目录: $BACKUP_DIR"
        mkdir -p "$BACKUP_DIR"
    fi
}

# 创建备份
create_backup() {
    local backup_type=$1
    local timestamp=$(date '+%Y%m%d%H%M%S')
    local backup_file="${BACKUP_DIR}/${BACKUP_PREFIX}-${backup_type}-${timestamp}.tar.gz"
    local source_dir
    
    case $backup_type in
        "raw")
            source_dir="$SOURCE_DATA_DIR"
            ;;
        "cleaned")
            source_dir="$CLEANED_DATA_DIR"
            ;;
        "features")
            source_dir="$FEATURE_DATA_DIR"
            ;;
        "logs")
            source_dir="$LOGS_DIR"
            ;;
        "all")
            # 全量备份
            log "开始执行全量备份..."
            create_backup "raw"
            create_backup "cleaned"
            create_backup "features"
            create_backup "logs"
            return 0
            ;;
        *)
            log "错误: 不支持的备份类型: $backup_type"
            return 1
            ;;
    esac
    
    if [ -d "$source_dir" ]; then
        log "开始备份 $source_dir 到 $backup_file"
        tar -czf "$backup_file" -C "$(dirname "$source_dir")" "$(basename "$source_dir")"
        
        if [ $? -eq 0 ]; then
            log "备份完成: $backup_file"
            log "备份大小: $(du -h "$backup_file" | cut -f1)"
            return 0
        else
            log "错误: 备份失败"
            rm -f "$backup_file" 2>/dev/null
            return 1
        fi
    else
        log "警告: 源目录不存在: $source_dir"
        return 1
    fi
}

# 清理过期备份
cleanup_old_backups() {
    log "开始清理过期备份（保留 $RETENTION_DAYS 天内的备份）"
    find "$BACKUP_DIR" -name "${BACKUP_PREFIX}-*.tar.gz" -mtime +$RETENTION_DAYS -delete
    
    if [ $? -eq 0 ]; then
        log "过期备份清理完成"
    else
        log "警告: 过期备份清理过程中出现错误"
    fi
}

# 显示帮助信息
show_help() {
    echo "用法: $0 [选项]"
    echo "数据备份脚本，用于备份项目中的重要数据"
    echo ""
    echo "选项:"
    echo "  -t, --type <类型>      备份类型: raw, cleaned, features, logs, all (默认: all)"
    echo "  -d, --dir <目录>       备份目标目录 (默认: ./data/backup)"
    echo "  -r, --retention <天数> 备份保留天数 (默认: 30)"
    echo "  -h, --help             显示帮助信息"
    echo ""
    echo "环境变量:"
    echo "  BACKUP_DIR             同 --dir 选项"
    echo "  RETENTION_DAYS         同 --retention 选项"
    echo "  SOURCE_DATA_DIR        原始数据目录"
    echo "  CLEANED_DATA_DIR       清洗后数据目录"
    echo "  FEATURE_DATA_DIR       特征数据目录"
    echo "  LOGS_DIR               日志目录"
}

# 解析命令行参数
parse_args() {
    local backup_type="all"
    
    while [[ $# -gt 0 ]]; do
        case $1 in
            -t|--type)
                backup_type=$2
                shift 2
                ;;
            -d|--dir)
                BACKUP_DIR=$2
                shift 2
                ;;
            -r|--retention)
                RETENTION_DAYS=$2
                shift 2
                ;;
            -h|--help)
                show_help
                exit 0
                ;;
            *)
                log "错误: 未知选项: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    return $backup_type
}

# 主函数
main() {
    log "===== 数据备份脚本启动 ====="
    
    # 解析命令行参数
    local backup_type=$(parse_args "$@")
    
    # 确保备份目录存在
    ensure_backup_dir
    
    # 创建备份
    create_backup "$backup_type"
    local backup_result=$?
    
    # 清理过期备份
    cleanup_old_backups
    
    if [ $backup_result -eq 0 ]; then
        log "===== 数据备份脚本执行成功 ====="
        exit 0
    else
        log "===== 数据备份脚本执行失败 ====="
        exit 1
    fi
}

# 执行主函数
main "$@"